package com.bw.util;

import cn.hutool.core.date.DateUtil;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.util.Date;

/**
 * 标签计算工具类（匹配文档规则）
 * 文档参考：🔶1-30（年龄多维度判定）、🔶1-185（体重单位转换）、🔶1-254（星座分界）
 */
public class ProfileCalcUtil {
    /**
     * 1. 体重数据标准化（斤→kg、异常值过滤）
     * 文档参考：🔶1-185（120斤→60kg）、🔶1-189（过滤<30kg或>200kg）
     */
    public static Double standardizeWeight(String weightStr) {
        if (weightStr == null || weightStr.isEmpty()) return null;
        // 提取数值（如"61.8kg"→61.8，"120斤"→120）
        double num = Double.parseDouble(weightStr.replaceAll("[^0-9.]", ""));
        // 单位转换：斤→kg
        if (weightStr.contains("斤")) {
            num = num / 2;
        }
        // 异常值过滤
        if (num < 30 || num > 200) return null;
        // 保留1位小数
        return new BigDecimal(num).setScale(1, RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 2. 身高数据标准化（异常值过滤）
     * 文档参考：🔶1-227（过滤<100cm或>250cm）
     */
    public static Double standardizeHeight(String heightStr) {
        if (heightStr == null || heightStr.isEmpty()) return null;
        double num = Double.parseDouble(heightStr.replaceAll("[^0-9.]", ""));
        if (num < 100 || num > 250) return null;
        return new BigDecimal(num).setScale(1, RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 3. 星座计算（基于生日）
     * 文档参考：🔶1-254（摩羯座12.22-1.19等）
     */
    public static String calcConstellation(String birthDate) {
        if (birthDate == null || birthDate.isEmpty() || !birthDate.matches("^\\d{4}-\\d{2}-\\d{2}$")) {
            return "未知";
        }
        Date date = DateUtil.parse(birthDate, "yyyy-MM-dd");
        int month = DateUtil.month(date) + 1; // Hutool月份从0开始
        int day = DateUtil.dayOfMonth(date);

        switch (month) {
            case 1: return (day >= 20) ? "水瓶座" : "摩羯座";
            case 2: return (day >= 19) ? "双鱼座" : "水瓶座";
            case 3: return (day >= 21) ? "白羊座" : "双鱼座";
            case 4: return (day >= 20) ? "金牛座" : "白羊座";
            case 5: return (day >= 21) ? "双子座" : "金牛座";
            case 6: return (day >= 22) ? "巨蟹座" : "双子座";
            case 7: return (day >= 23) ? "狮子座" : "巨蟹座";
            case 8: return (day >= 23) ? "处女座" : "狮子座";
            case 9: return (day >= 23) ? "天秤座" : "处女座";
            case 10: return (day >= 24) ? "天蝎座" : "天秤座";
            case 11: return (day >= 23) ? "射手座" : "天蝎座";
            case 12: return (day >= 22) ? "摩羯座" : "射手座";
            default: return "未知";
        }
    }

    /**
     * 4. 出生年代计算（基于生日）
     * 文档参考：🔶1-17（出生年代标签）
     */
    public static String calcBirthEra(String birthDate) {
        if (birthDate == null || birthDate.isEmpty() || !birthDate.matches("^\\d{4}-\\d{2}-\\d{2}$")) {
            return "未知";
        }
        int year = Integer.parseInt(birthDate.split("-")[0]);
        if (year >= 1970 && year <= 1979) return "70后";
        if (year >= 1980 && year <= 1989) return "80后";
        if (year >= 1990 && year <= 1999) return "90后";
        if (year >= 2000 && year <= 2009) return "00后";
        if (year >= 2010) return "10后";
        return "未知";
    }

    /**
     * 5. 行为权重映射（buy=0.5，collect/add_cart=0.3，browse=0.2）
     * 文档参考：🔶1-129（购买权重50%）、🔶1-132（加购/收藏30%）、🔶1-135（浏览20%）
     */
    public static double getBehaviorWeight(String behaviorType) {
        switch (behaviorType) {
            case "buy": return 0.5;
            case "collect":
            case "add_cart": return 0.3;
            case "browse": return 0.2;
            default: return 0.0;
        }
    }
}